ホームに戻る
出典 :
C++11 の Tuple で複数個の型をまとめて扱う - C++ プログラミング tie - cpprefjp C++日本語リファレンス
関連 :
C++11 Plain Old Data (POD) 型推論 [C#]タプル
目次 :

タプルとは

複数個の値をまとめて管理できるデータ型。C++11で追加された。
構造体やクラスと異なり事前の型定義が必要なく、簡便に用いることができる。

一般形

// タプル型変数 tupleValue1 の宣言 std::tuple<int, CMyClass, double> tupleValue1; // tupleValue1 の各要素に代入 std::get<0>(tupleValue1) = 10; std::get<1>(tupleValue1) = instance; std::get<2>(tupleValue1) = 15.5; // tupleValue1 の各要素を参照 int value1 = std::get<0>(tupleValue1); CMyClass value2 = std::get<1>(tupleValue1); double value3 = std::get<2>(tupleValue1); // コンストラクタを用いたタプルの初期化 std::tuple<int, CMyClass, double> tupleValue2 = std::tuple<int, CMyClass, double>(10, instance, 15.5); // タプルの代入 std::tuple<int, CMyClass, double> tupleValue3 = tupleValue2;
タプルは任意の型、任意の数の要素を保持することができ、宣言時に各要素の型を記述する。
要素の参照および更新には std::get<x>() 関数を用いる。x には該当する要素の番号( 0 ~)を指定する。
std::get<x>() 関数は要素への参照を返すため、代入式の左辺とすることができる。
また、コンストラクタを用いて宣言時に初期化することや、同じ型のタプルを代入することもできる。

要素数の取得

std::tuple<int, CMyClass, double> tupleValue; // タプルの要素数を取得 (型を渡す) // count1 == 3 size_t count1 = std::tuple_size< std::tuple<int, CMyClass, double> >::value; // タプルの要素数を取得 (既存のインスタンスから型を取得して渡す) // count2 == 3 size_t count2 = std::tuple_size< decltype(tupleValue) >::value;
std::tuple_size<T> の T にタプル型を渡し、さらに value を参照することで要素数を取得できる。
既にタプル型の変数が存在する場合は、decltype() で型を推論できる。

タプルの構築 ( make_tuple() )

// make_tuple() 関数でタプル変数を構築 auto tupleValue = std::make_tuple(10, 15.3, &instance);
std::make_tuple() 関数を使用すると、タプル型の値を構築できる。
このとき、各要素の型は指定された初期値から推論される。
初期値に変数を指定した場合も同様で、新しく確保されたタプル型に変数の値がコピーされる。
(後述の tie() との差異に注意。)

既存の変数をタプル化 ( tie() )

int a = 10; double b = 0.5; std::vector<int> c = { 1, 3 }; // tie() 関数で変数 a 、b 、c をタプルにまとめる auto tupleValue = std::tie(a, b, c); // a の値を更新すると、tupleValue にも波及 a = 20; int value1 = std::get<0>(tupleValue); //< value1 == 20 // tupleValue の内容を更新すると、元の変数にも波及 std::get<1>(tupleValue) = 3.8; //< b == 3.8
std::tie() 関数を使用すると、既存の変数をタプルとして管理できるようになる。
make_tuple() は値のみがコピーされるが、tie() では元の変数への参照をタプルが保持する
このため tie() の引数に指定できるのは変数のみで、値(リテラル)は指定できない。

複数のタプルを連結 ( tuple_cat() )

// タプル変数 tuple1 、tuple2 を生成 auto tuple1 = std::make_tuple(10, 3.3, "aa"); //< 要素数 : 3 auto tuple2 = std::make_tuple(3.2f, "bb"); //< 要素数 : 2 // tuple1 、tuple2 を連結した tuple3 を生成 auto tuple3 = std::tuple_cat(tuple1, tuple2); //< 要素数 : 3 + 2 = 5 auto value0 = std::get<0>(tuple3); //< value0 == 10 auto value1 = std::get<1>(tuple3); //< value1 == 3.3 auto value2 = std::get<2>(tuple3); //< value2 == "aa" auto value3 = std::get<3>(tuple3); //< value3 == 3.2f auto value4 = std::get<4>(tuple3); //< value4 == "bb"
std::tuple_cat() 関数は、引数に指定されたタプルを連結し、新たなタプルを生成する。

タプルと型推論

前述したように、make_tuple() や tie() などは戻り値を auto で受けることで、タプルの詳細な型を知ることなく用いることができる。
このようにタプルは型推論( auto 、decltype() )と共に用いることで利便性を最大限に発揮できる。
型推論についてはここを参照。